﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
void f(int& x)
{
	std::cout << "左值引用重载 f(" << x << ")\n";
}
void f(const int& x)
{
	std::cout << "到 const 的左值引用重载 f(" << x << ")\n";
}
void f(int&& x)
{
	std::cout << "右值引用重载 f(" << x << ")\n";
}

//万能引用
template<class T>
void Function(T&& t)
{
	int a = 0;
	T x = a;
	//x++;
	cout << &a << endl;
	cout << &x << endl << endl;
}

int main()
{
	//int i = 1;
	//const int ci = 2;
	//f(i); // 调⽤ f(int&) 
	//f(ci); // 调⽤ f(const int&) 
	//f(3); // 调⽤ f(int&&)，如果没有 f(int&&) 重载则会调⽤ f(const int&) 
	//f(std::move(i)); // 调⽤ f(int&&) 
	//// 右值引⽤变量在⽤于表达式时是左值 
	//
	//
 //   int&& x = 1;
	//f(x); // 调⽤ f(int& x) 
	//f(std::move(x)); // 调⽤ f(int&& x) 

	//typedef int& lref;
	//typedef int&& rref;
	//int n = 0;
	////引用折叠，只要有一个左值引用就是左值引用
	//lref& r1 = n; // r1 的类型是 int& 
	//lref&& r2 = n; // r2 的类型是 int& 
	//rref& r3 = n; // r3 的类型是 int& 
	////rref&& r4 = 1; // r4 的类型是 int&& 

	string st = "test";
	string&& s1 = st + st;
	cout << &(st+st);


	return 0;
}
